/**
 * WebSocketManager Mock模式测试示例
 * 快速验证Mock模式下的即时连接和对话功能
 */

import WebSocketManager from './WebSocketManager.js';

/**
 * 测试Mock模式的基本功能
 */
async function testMockMode() {
	console.log('🚀 开始测试Mock模式...');
	
	try {
		// 1. 创建Mock模式实例
		const ws = WebSocketManager.getInstance({
			mockMode: true,
			agentId: 'test-agent-001',
			historyId: 'test-chat-001',
			logging: {
				enabled: true,
				level: 'debug'
			}
		});
		
		console.log('✅ WebSocket管理器实例创建成功');
		
		// 2. 测试即时连接
		console.log('📡 测试即时连接...');
		const connectStart = Date.now();
		await ws.connect();
		const connectTime = Date.now() - connectStart;
		
		console.log(`✅ 连接成功! 耗时: ${connectTime}ms`);
		console.log('📊 连接状态:', {
			isConnected: ws.isConnected,
			connectionState: ws.connectionState,
			mockMode: ws.config.mockMode
		});
		
		// 3. 测试普通对话
		console.log('💬 测试普通对话...');
		await ws.sendAIMessage('你好，这是一个测试消息');
		console.log('✅ 普通对话发送成功');
		
		// 4. 测试深度思考功能
		console.log('🧠 测试深度思考功能...');
		await ws.sendAIMessage('请帮我分析一下人工智能的发展趋势', {
			deepThink: true,
			webSearch: false
		});
		console.log('✅ 深度思考消息发送成功');
		
		// 5. 测试联网搜索模拟
		console.log('🌐 测试联网搜索模拟...');
		await ws.sendAIMessage('最新的科技新闻有哪些？', {
			deepThink: false,
			webSearch: true
		});
		console.log('✅ 联网搜索消息发送成功');
		
		// 6. 测试消息订阅
		console.log('📢 测试消息订阅...');
		let messageCount = 0;
		const unsubscribe = ws.subscribe('*', (messageData, rawMessage) => {
			messageCount++;
			console.log(`📨 收到消息 #${messageCount}:`, {
				type: typeof messageData === 'object' ? messageData.type : 'text',
				content: typeof messageData === 'string' ? messageData.substring(0, 50) : 'object',
				hasRawData: !!rawMessage.data
			});
		});
		
		// 发送一条测试消息触发订阅
		await ws.sendAIMessage('测试消息订阅功能');
		
		// 等待一段时间接收Mock回答
		await new Promise(resolve => setTimeout(resolve, 2000));
		
		// 取消订阅
		unsubscribe();
		console.log(`✅ 消息订阅测试完成，共收到 ${messageCount} 条消息`);
		
		// 7. 测试状态查询
		console.log('📊 测试状态查询...');
		const state = ws.getState();
		const stats = ws.getStats();
		
		console.log('📈 连接状态:', {
			isConnected: state.isConnected,
			uptime: state.uptime,
			queueLength: state.queueLength,
			subscribersCount: state.subscribersCount
		});
		
		console.log('📉 统计信息:', {
			messagesSent: stats.messagesSent,
			messagesReceived: stats.messagesReceived,
			sessionDuration: stats.sessionDuration
		});
		
		// 8. 使用内置测试方法
		console.log('🔧 使用内置测试方法...');
		const testResult = await ws.testMockMode();
		console.log(`✅ 内置测试结果: ${testResult ? '通过' : '失败'}`);
		
		console.log('🎉 所有测试完成！Mock模式工作正常');
		return true;
		
	} catch (error) {
		console.error('❌ 测试失败:', error);
		return false;
	}
}

/**
 * 测试Mock模式与真实模式的切换
 */
async function testModeSwitch() {
	console.log('🔄 测试模式切换...');
	
	try {
		// 获取同一个实例
		const ws = WebSocketManager.getInstance();
		
		// 切换到Mock模式
		console.log('切换到Mock模式...');
		ws.updateConfig({ mockMode: true });
		await ws.reconnect();
		console.log('✅ 成功切换到Mock模式');
		
		// 测试Mock模式功能
		await ws.sendAIMessage('Mock模式测试消息');
		
		// 切换回正式模式（仅作演示，实际不会连接）
		console.log('尝试切换到正式模式...');
		ws.updateConfig({ 
			mockMode: false,
			url: 'wss://demo.example.com/ws' // 演示用URL
		});
		
		console.log('✅ 模式切换测试完成');
		return true;
		
	} catch (error) {
		console.error('❌ 模式切换测试失败:', error);
		return false;
	}
}

/**
 * 性能测试：Mock模式的响应速度
 */
async function testMockPerformance() {
	console.log('⚡ 测试Mock模式性能...');
	
	try {
		const ws = WebSocketManager.getInstance({
			mockMode: true,
			agentId: 'perf-test-agent',
			logging: { enabled: false } // 关闭日志以提高性能
		});
		
		// 测试连接速度
		const connectTimes = [];
		for (let i = 0; i < 5; i++) {
			const start = Date.now();
			await ws.connect();
			connectTimes.push(Date.now() - start);
			ws.disconnect();
		}
		
		console.log('📊 连接性能测试结果:', {
			平均连接时间: Math.round(connectTimes.reduce((a, b) => a + b) / connectTimes.length) + 'ms',
			最快连接: Math.min(...connectTimes) + 'ms',
			最慢连接: Math.max(...connectTimes) + 'ms'
		});
		
		// 重新连接进行消息发送测试
		await ws.connect();
		
		// 测试消息发送速度
		const sendTimes = [];
		for (let i = 0; i < 10; i++) {
			const start = Date.now();
			await ws.sendAIMessage(`性能测试消息 #${i + 1}`);
			sendTimes.push(Date.now() - start);
		}
		
		console.log('📊 消息发送性能测试结果:', {
			平均发送时间: Math.round(sendTimes.reduce((a, b) => a + b) / sendTimes.length) + 'ms',
			最快发送: Math.min(...sendTimes) + 'ms',
			最慢发送: Math.max(...sendTimes) + 'ms'
		});
		
		console.log('✅ 性能测试完成');
		return true;
		
	} catch (error) {
		console.error('❌ 性能测试失败:', error);
		return false;
	}
}

/**
 * 运行所有测试
 */
async function runAllTests() {
	console.log('🎯 开始运行WebSocketManager Mock模式完整测试套件...\n');
	
	const results = {
		basicTest: await testMockMode(),
		switchTest: await testModeSwitch(), 
		performanceTest: await testMockPerformance()
	};
	
	console.log('\n📋 测试结果汇总:');
	console.log('基础功能测试:', results.basicTest ? '✅ 通过' : '❌ 失败');
	console.log('模式切换测试:', results.switchTest ? '✅ 通过' : '❌ 失败');
	console.log('性能测试:', results.performanceTest ? '✅ 通过' : '❌ 失败');
	
	const allPassed = Object.values(results).every(result => result);
	console.log('\n🏆 总体结果:', allPassed ? '✅ 所有测试通过' : '❌ 部分测试失败');
	
	// 清理：销毁实例
	WebSocketManager.destroyInstance();
	console.log('🧹 测试环境清理完成');
	
	return allPassed;
}

// 浏览器环境支持
if (typeof window !== 'undefined' && window.location) {
	window.testWebSocketManager = runAllTests;
	console.log('💡 在浏览器控制台中运行: testWebSocketManager()');
}

// 导出所有测试函数
export { 
	runAllTests,
	testMockMode, 
	testModeSwitch, 
	testMockPerformance 
};

export default {
	runAllTests,
	testMockMode,
	testModeSwitch,
	testMockPerformance
}; 